package bufferedstream;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * BufferedOutputStream类:
 *     该类底层使用了缓存,提高了读写效率
 *  构造方法:
 *      public BufferedOutputStream(OutputStream out)
 *          基于基本的写入流创建一个缓存流,利用该流完成写操作,并且提高效率
 *   成员方法:
 *    public void write(int b) throws IOException: 写入单个字节,本质上是把字节写入BufferedOutputStream底层的字节数组中
 *    public void write(byte[] b) throws IOException: 写入字节数组,其实是把字节数组中的所有字节写入BufferedOutputStream底层的字节数组中
 *    public void write(byte[] b, int off, int len) throws IOException:将字节数组中,从off索引开始,写入len个字节(包含off索引的字节)
 *
 *    public void close() throws IOException : 先刷新,再关流释放资源
 *    public void flush() throws IOException: 将缓存流底层字节数组中的数据刷新到文件中
 *
 * BufferedOutputStream原理:
 *    1.BufferedOutputStream底层默认使用的是一个长度为8192的字节数组(byte[] buf = new byte[8192])
 *    2.当调用write()方法时,会把字节先写入到底层的字节数组中,然后通过flush()或close()方法将字节数组中的字节刷新到文件中
 */
public class BufferedStreamDemo01 {
    public static void main(String[] args) throws Exception {
        //method01();
        //method02();
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("day22-IO-01/9.txt"));

        bos.write("abcdef".getBytes(), 2, 3);//写入的是cde字节

        bos.close();
    }

    private static void method02() throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream("day22-IO-01/8.txt"));

        bos.write("abc".getBytes());

        bos.close();
    }

    private static void method01() throws IOException {
        //1.先创建FileOutputStream来关联一个文件
        FileOutputStream fos = new FileOutputStream("day22-IO-01/7.txt");

        //2.通过fos对象来构建BufferedOutputStream
        BufferedOutputStream bos = new BufferedOutputStream(fos);

        //3.写入一个字节
        bos.write(97);

        //4.关流释放资源
        //bos.flush();
        bos.close();
    }
}
